﻿#define  _CRT_SECURE_NO_WARNINGS 1
//小蓝最近在研究一种浮点数的表示方法：
//R
//R 格式。对于一个大于
//0
//0 的浮点数
//d
//d，可以用
//R
//R 格式的整数来表示。给定一个转换参数
//n
//n，将浮点数转换为
//R
//R 格式整数的做法是：
//
//将浮点数乘以
//2
//n
//2
//n
//。
//四舍五入到最接近的整数。
#include<iostream>
#include<math.h>
using namespace std;
//int main()
//{
//	int n;
//	float d;
//	cin >> n >> d;
//	d = d * pow(2, n);
//	long long int ret = (long long int)(d+0.5);
//	cout << ret << endl;
//	return 0;
//
//
//}
//void c(int* arr,int& size)
//{
//	for (int i = 0; i < size; i++)
//	{
//		arr[i] *= 2;
//	}
//	//进位
//	for (int i = 0; i < size; i++)
//	{
//		arr[i + 1] += arr[i] / 10;
//		arr[i] = arr[i] % 10;
//	}
//	if (arr[size])
//		size++;
//}
//int main()
//{
//	int arr[10005] = { 0 };
//	string a;
//	int n;
//	cin >> n >> a;
//	reverse(a.begin(), a.end());
//	int p = a.find('.');
//	a.erase(p, 1);
//	int size = a.size();
//	for (int i = 0; i < size; i++)
//	{
//		arr[i] = a[i] - '0';
//	}
//	for (int i = 0; i < n; i++)
//	{
//		c(arr,size);
//	}
//	if (arr[p - 1] >= 5)
//	{
//		arr[p]++;
//	}
//	for (int i = 0; i < size; i++)
//	{
//		arr[i + 1] += arr[i] / 10;
//		arr[i] = arr[i] % 10;
//	}
//	if (arr[size])
//		size++;
//	for (int i = size-1; i >= p; i--)
//	{
//		cout << arr[i];
//	}
//	return 0;
//}



//小明发现有很多方案可以把一个很大的正整数拆成若干正整数的和。他采取了其中两种方案，分别将他们列为两个数组
//{
//a
//1
//,
//a
//2
//,
//⋯
//a
//n
//}
//{a
//1
//​
//, a
//2
//​
//, ⋯a
//n
//​
//} 和
//{
//b
//1
//,
//b
//2
//,
//⋯
//b
//m
//}
//{b
//1
//​
//, b
//2
//​
//, ⋯b
//m
//​
//}。两个数组的和相同。
//
//定义一次合并操作可以将某数组内相邻的两个数合并为一个新数，新数的值是原来两个数的和。小明想通过若干次合并操作将两个数组变成一模一样，即
//n
//=
//m
//n = m 且对于任意下标
//i
//i 满足
//a
//i
//=
//b
//i
//a
//i
//​
//= b
//i
//​
//。请计算至少需要多少次合并操作可以完成小明的目标。
//
//输入格式
//输入共
//3
//3 行。
//
//第一行为两个正整数
//n
//,
//m
//n, m。
//
//第二行为
//n
//n 个由空格隔开的整数
//a
//1
//,
//a
//2
//,
//⋯
//
//,
//a
//n
//a
//1
//​
//, a
//2
//​
//, ⋯, a
//n
//​
//。
//
//第三行为
//m
//m 个由空格隔开的整数
//b
//1
//,
//b
//2
//,
//⋯
//
//,
//b
//m
//b
//1
//​
//, b
//2
//​
//, ⋯, b
//m
//​
//。
//
//输出格式
//输出共
//1
//1 行，一个整数。
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>

typedef int QDatatype;

//定义队列结点结构
typedef struct QueueNode
{
	QDatatype data;
	struct QueueNode* next;
}QueueNode;
//定义队列结构
typedef struct Queue
{
	QueueNode* phead;
	QueueNode* ptail;
}Queue;
void QueueInit(Queue* pq)
{
	assert(pq);
	pq->phead = pq->ptail = NULL;
}

//入队(自己写的，未优化）
//void QueuePush(Queue* pq, QDatatype x)
//{
//	assert(pq);
//	if (pq->phead == NULL)
//	{
//		pq->phead = pq->ptail = (QueueNode*)malloc(sizeof(QueueNode));
//		pq->phead->data = x;
//		pq->phead->next = NULL;
//	}
//	else {
//		pq->ptail->next = (QueueNode*)malloc(sizeof(QueueNode));
//		pq->ptail = pq->ptail->next;
//		pq->ptail->data = x;
//		pq->ptail->next = NULL;
//	}
//}

//入队（优化后）
void QueuePush(Queue* pq, QDatatype x)
{
	assert(pq);
	QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
	if (newnode == NULL)
	{
		perror("malloc fail!\n");
		exit(1);
	}
	newnode->data = x;
	newnode->next = NULL;

	//队列为空，队头和队尾都是newnode
	if (pq->phead == NULL)
	{
		pq->phead = pq->ptail = newnode;
	}
	else {
		//pq->ptail newnode
		pq->ptail->next = newnode;
		pq->ptail = pq->ptail->next;
	}
}

//判断队列是否为空
bool QueueEmpty(Queue* pq)
{
	assert(pq);
	return pq->phead == NULL;
}

//出队
void QueuePop(Queue* pq)
{
	assert(!QueueEmpty(pq));
	if (pq->phead == pq->ptail)
	{
		free(pq->phead);
		pq->phead = pq->ptail = NULL;
	}
	else 
	{
		QueueNode* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
	}
}

//取队头数据
QDatatype QueueFront(Queue* pq)
{
	assert(!QueueEmpty(pq));
	return pq->phead->data;
}

//取队尾数据
QDatatype QueueBack(Queue* pq)
{
	assert(pq);
	assert(!QueueEmpty(pq));
	return pq->ptail->data;
}

void QueueDestory(Queue* pq)
{
	assert(pq);
	while (pq->phead)
	{
		QueueNode* next = pq->phead->next;
		free(pq->phead);
		pq->phead = next;
	}
	pq->phead = pq->ptail = NULL;
}

//队列有效个数
int QueueSize(Queue* pq)
{
	int size = 0;
	QueueNode* pcur = pq->phead;
	while (pcur)
	{
		size++;
		pcur = pcur->next;
	}
	return size;


}

int main()
{
	Queue* q1=(Queue*)malloc(sizeof(Queue)), * q2= (Queue*)malloc(sizeof(Queue));
	QueueInit(q1);
	QueueInit(q2);
	int sum = 0;
	int n, m;
	cin >> n >> m;
	for (int i = 0; i < n; i++)
	{
		int x;
		cin >> x;
		QueuePush(q1, x);
	}
	for (int i = 0; i < m; i++)
	{
		int x;
		cin >> x;
		QueuePush(q2, x);
	}
	while (!QueueEmpty(q1))
	{
		if (QueueFront(q1) == QueueFront(q2))
		{
			QueuePop(q1);
			QueuePop(q2);
		}
		else if (QueueFront(q1) < QueueFront(q2))
		{
			q1->phead->next->data += q1->phead->data;
			QueuePop(q1);
			sum++;
		}
		else
		{
			q2->phead->next->data += q2->phead->data;
			QueuePop(q2);
			sum++;
		}
	}
	cout << sum << endl;
}